旧游无处不堪寻
无寻处,惟有少年心
ASP.Net MVC(七)

这一篇,我们讲讲数据验证、布局试图以及 Controller 向 View 传递少量数据的方式。

数据注释(DataAnnotations)


ASP.Net MVC 使用 DataAnnotations attribute 实现数据验证。
DataAnnotations 为不同的验证规则内建了许多验证特性,可以应用于模型类的属性。ASP.NET MVC 将自动强制执行这些验证规则并在视图中显示验证消息。

DataAnnotations attribute 位于 System.ComponentModel.DataAnnotations 命名空间。
下面列出 DataAnnotations attribute:

Attribute 描述
Required 表示该属性是必填字段
StringLength 定义字符串字段的最大长度
Range 定义数字字段的最大值和最小值
RegularExpression 指定字段值必须与指定的正则表达式匹配
CustomValidation 指定的自定义验证方法以验证字段
EmailAddress 使用电子邮件地址格式验证
FileExtension 使用文件扩展名进行验证
MaxLength 指定字符串字段的最大长度
MinLength 指定字符串字段的最小长度
Phone 指定该字段是使用电话号码的正则表达式的电话号码

我们在 Controller 的 Action 方法中使用 ModelState.IsValid 属性,来判断模型是否通过验证。

它为每个字段调用 HtmlHelper 的扩展方法 ValidationMessageFor,并在顶部调用 ValidationSummary 方法。
ValidationMessageFor 负责显示指定字段的错误消息。ValidationSummary 一次显示所有错误消息的列表。

Layout View


一个应用程序可能会有一些公共 UI 部分,如 logo、导航部分、footer 部分等。ASP.NET MVC 引入了一个 Layout 视图,使得我们不必在每个页面中编写相同的代码。

Razor 的布局视图和普通视图一样,以 .cshtml 作为后缀,存储在 View/Shared 文件夹中。脚手架会自动创建一个 _Layout.cshtml 文件。
布局视图中会调用 RenderBody 方法和 RenderSection 方法。RenderBody 就像其他视图的占位符一样,将使用该布局文件的视图注入。

使用布局视图

默认情况下,Views 文件夹中有一个 _ViewStart.cshtml。它使用 Layout 属性为文件夹及其子文件夹中的所有视图设置默认布局页面。您可以将任何布局页面的有效路径分配给布局属性。
我们也可以在单个视图中设置 Layout 属性,覆盖 _ViewStart.cshtml 中的布局视图。可以设置为 null,不使用布局视图。

渲染方法

ASP.NET MVC 布局视图使用以下方法呈现子视图:

  • RenderBody,呈现子视图中不在命名部分内的部分。布局视图必须包含 RenderBody 方法。
  • RenderSection,呈现命名部分的内容并指定该部分是否是必需的。RenderSection 方法在布局视图中是可选的。

RenderSection 方法指定一个部分的名称,在子视图中使用 @section 定义命名部分,在运行时,子视图将在调用 RenderSection 方法的适当位置呈现。
索引视图的其余部分(不在任何已命名的部分中)将呈现调用 RenderBody 方法的位置。

数据传输


模型对象用于在 Razor 视图中发送数据。但是,在某些情况下,您可能希望向视图发送少量临时数据。有三种方法:

  • ViewBag
  • ViewData
  • TempData

ViewBag

viewBag 是 ControllerBase 类的动态类型属性,ControllerBase 是之前我们说的 Controller 类型的基类。

使用点语法将属性附加到 ViewBag,并在控制器中为其指定其值,可以在视图中使用 @ViewBag. 方法获取该属性。
注意: ViewBag 仅将数据从控制器传输到视图,反之不行。如果发生重定向,ViewBag 值将为 null。
ViewBag 是 ViewData 的包装器。

ViewData

ViewData 类似于 ViewBag。它在将数据从 Controller 传输到 View 时非常有用。
ViewData 是一个字典,可以包含键值对,其中每个键必须是字符串。

ViewData 仅将数据从控制器传输到视图。它仅在当前请求期间有效。

注意: 我们必须将 ViewData 值强制转换为适当的数据类型。
ViewData 和 ViewBag 都在内部使用相同的字典。因此,您不能将 ViewData Key 与 ViewBag 的属性名称匹配,否则会抛出运行时异常。

TempData

TempData 可用于存储可在后续请求中使用的临时数据。在完成后续请求后,TempData 将被清除。

当您想要将非敏感数据从一个 Action 方法传输到相同或不同控制器的另一个 Action 方法以及重定向时,TempData 非常有用。

假如我们在第一个请求中的 TempData 中添加了测试数据,在第二个后续请求中,我们从 TempData 访问了我们存储在第一个请求中的测试数据。但是,您无法在第三个请求中获取相同的数据,因为 TempData 将在第二个请求后被清除。

调用 TempData.Keep() 可以在第三个连续请求中保留 TempData 值。